package cn.stylefeng.guns.modular.agv.util;

import cn.hutool.http.HttpRequest;
import cn.hutool.json.JSONUtil;
import cn.hutool.log.StaticLog;
import cn.stylefeng.guns.core.util.DateUtil;
import cn.stylefeng.guns.modular.agv.model.params.HikAgvTaskJLParam;
import cn.stylefeng.guns.modular.agv.model.params.HikAgvTaskParam;
import cn.stylefeng.roses.core.util.ToolUtil;
import com.alibaba.fastjson.JSONObject;
import org.apache.commons.lang3.StringUtils;

import java.util.ArrayList;
import java.util.Random;
import java.util.UUID;


public class HikApiUtils {

    /**
     * 上层系统平台发送调度请求, RCS通过请求参数, 生成调度AGV任务单。
     * 生成所有车型的搬运任务
     *
     * @param baseUrl
     * @param param
     * @return
     */
    public static HikRsVo genAgvSchedulingTask(String baseUrl, HikAgvTaskParam param) {
        String url = baseUrl + "/genAgvSchedulingTask";
        //点到点位置
        ArrayList<JSONObject> positionCodePath = new ArrayList<JSONObject>();
        //起始位置
        JSONObject jsonObjectSrc = new JSONObject();
        jsonObjectSrc.put("positionCode", param.getSrcPositionCode());
        jsonObjectSrc.put("type", param.getSrcPositionType());
        positionCodePath.add(jsonObjectSrc);
        //终点位置
        JSONObject jsonObjectTar = new JSONObject();
        jsonObjectTar.put("positionCode", param.getTarPositionCode());
        jsonObjectTar.put("type", param.getTarPositionType());
        positionCodePath.add(jsonObjectTar);
        // 构建请求参数
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("reqCode",CodeGenerateUtil.generate());
        jsonObject.put("reqTime",DateUtil.DateFormat(param.getCreateTime(),"yyyy-MM-dd HH:mm:ss"));
        jsonObject.put("taskTyp",param.getTaskTyp());
        jsonObject.put("ctnrTyp",param.getCtnrTyp());
        jsonObject.put("positionCodePath",positionCodePath);
        //指定小车
        if(StringUtils.isNotBlank(param.getAgvCode())){
            jsonObject.put("agvCode",param.getAgvCode());
        }
        //指定优先级
        if(param.getPriority() !=null && param.getPriority() > 1){
            jsonObject.put("priority",param.getPriority());
        }
        //卡车数字标签 该数字越小优先级越高
        if(ToolUtil.isEmpty(param.getCarReq())){
            jsonObject.put("carReq","0");
        }else{
            jsonObject.put("carReq",param.getCarReq());
        }
        //任务数字标签 该数字越小优先级越高
        if(ToolUtil.isEmpty(param.getTaskReq())){
            jsonObject.put("taskReq","2");
        }else{
            jsonObject.put("taskReq",param.getTaskReq());
        }

        String rs = HttpRequest.post(url)
                .body(JSONUtil.toJsonStr(jsonObject))
                .execute().body();
        return JSONUtil.toBean(rs, HikRsVo.class);
    }

    /**
     * 上层系统平台发送调度请求, RCS通过请求参数, 生成调度AGV任务单。
     * 生成所有车型的搬运任务
     *JL长春
     * @param baseUrl
     * @param param
     * @return
     */
    public static HikRsVo genAgvSchedulingTaskJL(String baseUrl, HikAgvTaskJLParam param) {
        String url = baseUrl + "/genAgvSchedulingTask";
        //点到点位置
        ArrayList<JSONObject> positionCodePath = new ArrayList<JSONObject>();
        //起始位置
        JSONObject jsonObjectSrc = new JSONObject();
        jsonObjectSrc.put("positionCode", param.getSrcPositionCode());
        jsonObjectSrc.put("type", param.getSrcPositionType());
        positionCodePath.add(jsonObjectSrc);
        //终点位置
        JSONObject jsonObjectTar = new JSONObject();
        jsonObjectTar.put("positionCode", param.getTarPositionCode());
        jsonObjectTar.put("type", param.getTarPositionType());
        positionCodePath.add(jsonObjectTar);
        // 构建请求参数
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("reqCode",CodeGenerateUtil.generate());
        jsonObject.put("reqTime",DateUtil.DateFormat(param.getCreateTime(),"yyyy-MM-dd HH:mm:ss"));
        jsonObject.put("taskTyp",param.getTaskTyp());
        jsonObject.put("ctnrTyp",param.getCtnrTyp());
        // 生成唯一的数字 ctnrCode
        long timestamp = System.currentTimeMillis(); // 当前时间戳，单位是毫秒
        int randomNum = new Random().nextInt(1000); // 生成0到999之间的随机数

        // 将时间戳与随机数拼接，形成一个字符串，并转为数字
        String uniqueCtnrCode = String.valueOf(timestamp) + String.valueOf(randomNum);
        jsonObject.put("ctnrCode", uniqueCtnrCode); // 将唯一编号放入jsonObject中

        jsonObject.put("positionCodePath",positionCodePath);
        //指定小车
        if(StringUtils.isNotBlank(param.getAgvCode())){
            jsonObject.put("agvCode",param.getAgvCode());
        }
        //指定优先级
        if(param.getPriority() !=null && param.getPriority() > 1){
            jsonObject.put("priority",param.getPriority());
        }
        //卡车数字标签 该数字越小优先级越高
        if(ToolUtil.isEmpty(param.getCarReq())){
            jsonObject.put("carReq","0");
        }else{
            jsonObject.put("carReq",param.getCarReq());
        }
        //任务数字标签 该数字越小优先级越高
        if(ToolUtil.isEmpty(param.getTaskReq())){
            jsonObject.put("taskReq","2");
        }else{
            jsonObject.put("taskReq",param.getTaskReq());
        }

        String rs = HttpRequest.post(url)
                .body(JSONUtil.toJsonStr(jsonObject))
                .execute().body();
        return JSONUtil.toBean(rs, HikRsVo.class);
    }
    /**
     * 下发任务接口
     * @param baseUrl
     * @param param
     * @return
     */
    public static HikRsVo genctnrBinTask(String baseUrl, HikAgvTaskParam param) {
        String url = baseUrl + "/genCtnrBinTask";
        // 构建请求参数
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("reqCode",CodeGenerateUtil.generate());
        jsonObject.put("reqTime",DateUtil.getDateS());
        jsonObject.put("taskItemcode",param.getTaskNo());
        jsonObject.put("positionType",param.getPositionType());
        jsonObject.put("startArea",param.getStartArea());
        jsonObject.put("endCargoInfo",param.getEndcargoInfo());


        String rs = HttpRequest.post(url)
                .body(JSONUtil.toJsonStr(jsonObject))
                .execute().body();
        return JSONUtil.toBean(rs, HikRsVo.class);
    }
    /**
     * 设置任务优先级(1~127级),值越大,优先级越高。
     * 优先级生效仅在系统中AGV数量不足，存在多个优先级不同的任务时候，会按照优先级的先后顺序分配AGV执行。
     * 如果设置优先级失败，则全部失败。
     * @param baseUrl
     * @param param
     * @return
     */
    public static HikRsVo setTaskPriority(String baseUrl, HikAgvTaskParam param) {
        String url = baseUrl + "/setTaskPriority";
        // 构建请求参数
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("reqCode",CodeGenerateUtil.generate());
        jsonObject.put("reqTime",DateUtil.getDateS());
        //点到点位置
        ArrayList<JSONObject> priorities = new ArrayList<JSONObject>();
        //起始位置
        JSONObject jsonObjectSrc = new JSONObject();
        jsonObjectSrc.put("taskCode", param.getTaskNo());
        jsonObjectSrc.put("priority", param.getPriority());
        priorities.add(jsonObjectSrc);
        jsonObject.put("priorities",priorities);

        String rs = HttpRequest.post(url)
                .body(JSONUtil.toJsonStr(jsonObject))
                .execute().body();
        StaticLog.info("setTaskPriority：", rs);
        return JSONUtil.toBean(rs, HikRsVo.class);
    }
    /**
     * 设置任务优先级(1~127级),值越大,优先级越高。
     * 优先级生效仅在系统中AGV数量不足，存在多个优先级不同的任务时候，会按照优先级的先后顺序分配AGV执行。
     * 如果设置优先级失败，则全部失败。
     * @param baseUrl
     * @param param
     * @return
     */
    public static HikRsVo setTaskPriorityJL(String baseUrl, HikAgvTaskJLParam param) {
        String url = baseUrl + "/setTaskPriority";
        // 构建请求参数
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("reqCode",CodeGenerateUtil.generate());
        jsonObject.put("reqTime",DateUtil.getDateS());
        //点到点位置
        ArrayList<JSONObject> priorities = new ArrayList<JSONObject>();
        //起始位置
        JSONObject jsonObjectSrc = new JSONObject();
        jsonObjectSrc.put("taskCode", param.getTaskNo());
        jsonObjectSrc.put("priority", param.getPriority());
        priorities.add(jsonObjectSrc);
        jsonObject.put("priorities",priorities);

        String rs = HttpRequest.post(url)
                .body(JSONUtil.toJsonStr(jsonObject))
                .execute().body();
        StaticLog.info("setTaskPriority：", rs);
        return JSONUtil.toBean(rs, HikRsVo.class);
    }
    /**
     * 直接清空整条巷道的绑定数据，若有任务搬运过程中会进行锁定，无法清空。
     * @param baseUrl
     * @param roadWayCode
     * @return
     */
    public static HikRsVo clearRoadWay(String baseUrl, String roadWayCode) {
        String url = baseUrl + "/clearRoadWay";

        // 构建请求参数
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("reqCode",CodeGenerateUtil.generate());
        jsonObject.put("reqTime", DateUtil.getDateS());
        jsonObject.put("roadWayCode",roadWayCode);
        String rs = HttpRequest.post(url)
                .body(JSONUtil.toJsonStr(jsonObject))
                .execute().body();
        StaticLog.info("clearRoadWay：", rs);
        return JSONUtil.toBean(rs, HikRsVo.class);
    }

    /**
     * 任务取消
     * @param baseUrl
     * @param taskCode
     * @return
     */
    public static HikRsVo cancelTask(String baseUrl, String taskCode) {
        String url = baseUrl + "/cancelTask";

        // 构建请求参数
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("reqCode",CodeGenerateUtil.generate());
        jsonObject.put("reqTime", DateUtil.getDateS());
        jsonObject.put("taskCode",taskCode);
        String rs = HttpRequest.post(url)
                .body(JSONUtil.toJsonStr(jsonObject))
                .execute().body();
        StaticLog.info("clearRoadWay：", rs);
        return JSONUtil.toBean(rs, HikRsVo.class);
    }

}
